<?php
def("amicitia/persistencia/daos/","DaoPersona");
def("amicitia/persistencia/daos/","ConexionBD");
def("amicitia/modelo/entidades/","Persona");
def("amicitia/persistencia/excepciones/","IntegridadDatosException");

/**
 * Maneja todas las consideraciones de persistencia en MySql para con la
 * entidad Persona.
 * 
 * @author Willy A. Kuster
 */
class DaoPersonaMySql implements DaoPersona {

	const SELECT_PERSONA = "SELECT id, alias, password, nombre, apellido, email, sexo FROM persona WHERE id=%s";
	const SELECT_AUTENTICAR_PERSONA = "SELECT id FROM persona WHERE alias=%s AND password=SHA1(%s)";
	const INSERT_PERSONA = "INSERT INTO persona (id,alias,password,nombre,apellido,email,sexo) VALUES (%s,%s,SHA1(%s),%s,%s,%s,%s)";
	const DELETE_PERSONA = "DELETE FROM persona WHERE id=%s";

	private $conexion;

	public function __construct() {
		$this->conexion = ConexionBD::getConexionBD();
		//$this->conexion->conectar();
	}

	/**
	 * @see persistencia/daos/DaoPersona#obtenerPersona($id)
	 */
	public function obtenerPersona($id) {
		
		$id = $this->conexion->escaparCadena($id);
		$query = sprintf(self::SELECT_PERSONA,$id);
		$result = $this->conexion->seleccionar($query);

		if($obj = $result->fetch_object()){
			$persona = new Persona();
			$persona->setId($obj->id);
			$persona->setAlias($obj->alias);
			$persona->setPassword($obj->password);
			$persona->setNombre($obj->nombre);
			$persona->setApellido($obj->apellido);
			$persona->setEmail($obj->email);
			$persona->setSexo($obj->sexo);

			$result->close();

			return $persona;
		} else {
			return NULL;
		}
		
	}
	
	/**
	 * @see persistencia/daos/DaoPersona#guardarPersona($persona)
	 */
	public function guardarPersona(Persona $persona) {
		
		$this->verificarPersona($persona);
		
		$id = is_null($persona->getId()) ? "NULL" : (int)$this->conexion->escaparCadena($persona->getId());
		$alias = "'".$this->conexion->escaparCadena($persona->getAlias())."'";
		$password = "'".$this->conexion->escaparCadena($persona->getPassword())."'";
		$nombre = "'".$this->conexion->escaparCadena($persona->getNombre())."'";
		$apellido = "'".$this->conexion->escaparCadena($persona->getApellido())."'";
		$email = "'".$this->conexion->escaparCadena($persona->getEmail())."'";
		$sexo = "'".$this->conexion->escaparCadena($persona->getSexo())."'";
		
		$query = sprintf(self::INSERT_PERSONA,$id,$alias,$password,$nombre,$apellido,$email,$sexo);
		$id = $this->conexion->insertar($query);
		return $id;
		
	}
	
	/**
	 * @see persistencia/daos/DaoPersona#eliminarPersona($id)
	 */
	public function eliminarPersona($id) {
		
		$id = (int)$this->conexion->escaparCadena($id);
		$query = sprintf(self::DELETE_PERSONA,$id);
		$afectados = $this->conexion->actualizarOEliminar($query);
		
		if ($afectados==1) {
			return true;
		} else {
			return false;
		}
		
	}
	
	/**
	 * @see persistencia/daos/DaoPersona#autenticarPersona($alias, $password)
	 */
	public function autenticarPersona($alias,$password) {
		$alias = "'".$this->conexion->escaparCadena($alias)."'";
		$password = "'".$this->conexion->escaparCadena($password)."'";
		$query = sprintf(self::SELECT_AUTENTICAR_PERSONA,$alias,$password);
		$result = $this->conexion->seleccionar($query);

		if($obj = $result->fetch_object()){
			return $obj->id;
		} else {
			return null;
		}
	}
	
	/**
	 * Verifica la integridad del objeto Persona que se pase por parámetro.
	 * 
	 * @param $persona
	 * 			Un objeto Persona.
	 */
	private function verificarPersona(Persona $persona) {
		if(is_null($persona->getAlias()) || $persona->getAlias()=="")
			throw new IntegridadDatosException(get_class($persona),"alias",$persona->getAlias());
		if(is_null($persona->getPassword()) || $persona->getPassword()=="")
			throw new IntegridadDatosException(get_class($persona),"password",$persona->getPassword());
		if(is_null($persona->getNombre()) || $persona->getNombre()=="")
			throw new IntegridadDatosException(get_class($persona),"nombre",$persona->getNombre());
		if(is_null($persona->getApellido()) || $persona->getApellido()=="")
			throw new IntegridadDatosException(get_class($persona),"apellido",$persona->getApellido());
		if(is_null($persona->getEmail()) || $persona->getEmail()=="")
			throw new IntegridadDatosException(get_class($persona),"email",$persona->getEmail());
		if(is_null($persona->getSexo()) || $persona->getSexo()=="" || !in_array($persona->getSexo(),array('m','f')))
			throw new IntegridadDatosException(get_class($persona),"sexo",$persona->getSexo());
	}
	
}
?>